package com.lxz.jucdemo.lock_problem;

import java.util.concurrent.TimeUnit;

/**
 * @Author: 刘新智
 * @Date: 2025/10/27 15:01
 * @Description: synchronized 锁的是对方法的调用者
 * @Version: v1.0
 */
public class Test02 {
    public static void main(String[] args) {

        /**
         * 3、 增加了一个普通方法后！先执行发短信还是Hello？ 普通方法
         * 4、 两个对象，两个同步方法， 发短信还是 打电话？ // 打电话
         */

        /**
         * 分析：普通synchronized同步方法锁的是对象，phone和phone1是两个不同的对象，即两个线程拿到的是
         * 不同的锁，sendMes需要sleep(4)，而call()不需要sleep，所以先执行打电话
         * */


        Phone2 phone = new Phone2();
        Phone2 phone1 = new Phone2();

        new Thread(() -> {
            phone.sendSMS();
        }, "A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone1.call();
        }, "B").start();
    }
}

class Phone2 {
    public synchronized void sendSMS() {
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("发短信");
    }

    public synchronized void call() {
        System.out.println("打电话");
    }

    public void show() {
        System.out.println("正常情况");
    }
}
